package com.earthea.application.system.domain.service;

import com.earthea.application.common.entity.TableDataInfo;
import com.earthea.application.system.domain.entity.SysConfig;
import com.earthea.application.system.entity.request.SysConfigReq;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.math.NumberUtils;

import java.util.List;

/**
 * 系统配置接口
 */
public interface ISysConfigService {

    /**
     * 新增配置项
     *
     * @param config 配置项
     * @return 返回结果数
     */
    int insert(SysConfig config);

    /**
     * 修改配置项
     *
     * @param config 配置项
     * @return 返回结果数
     */
    int update(SysConfig config);

    /**
     * 校验参数键名是否唯一
     *
     * @param key 参数信息
     * @return 结果
     */
    boolean checkConfigKeyUnique(String key);

    /**
     * 查询配置
     *
     * @param idOrKey 配置项Key
     * @return 配置项
     */
    SysConfig getConfig(Object idOrKey);

    /**
     * 模糊查询配置
     *
     * @param req 查询参数
     * @return 配置项列表
     */
    TableDataInfo<SysConfig> select(SysConfigReq req);

    String getString(String key, String defaultValue);

    default String getString(String key) {
        return getString(key, null);
    }

    default boolean getBoolean(String key, boolean defaultValue) {
        return BooleanUtils.toBoolean(getString(key, String.valueOf(defaultValue)));
    }

    default boolean getBoolean(String key) {
        return getBoolean(key, false);
    }

    default int getInt(String key, int defaultValue) {
        return NumberUtils.toInt(getString(key, String.valueOf(defaultValue)), defaultValue);
    }

    default int getInt(String key) {
        return getInt(key, 0);
    }

    default long getLong(String key, int defaultValue) {
        return NumberUtils.toLong(getString(key, String.valueOf(defaultValue)), defaultValue);
    }

    default long getLong(String key) {
        return getLong(key, 0);
    }

    /**
     * 批量删除配置项
     *
     * @param configIds 配置项Key列表
     * @return 返回结果数
     */
    int batchDelete(List<Long> configIds);

    /**
     * 重置参数缓存数据
     */
    void resetConfigCache();

}
